import cv2
import os
import time
import glob
from pathlib import Path
import json

def display_images_with_opencv(folder_path=None, max_height=None, display_time=None, window_name=None):
    # 加载配置文件
    config_path = os.path.join(os.path.dirname(__file__), "config.json")
    try:
        with open(config_path, 'r', encoding='utf-8') as f:
            config = json.load(f)
        display_config = config.get("display", {})
        
        # 如果参数为None，则从配置文件中读取
        if folder_path is None:
            folder_path = display_config.get("folder_path", "qr_output")
        if max_height is None:
            max_height = display_config.get("max_height", 400)
        if display_time is None:
            display_time = display_config.get("display_time", 2)
        if window_name is None:
            window_name = display_config.get("window_name", "二维码显示")
    except Exception as e:
        print(f"无法加载配置文件，使用默认值: {e}")
        # 使用默认值
        if folder_path is None:
            folder_path = "qr_output"
        if max_height is None:
            max_height = 400
        if display_time is None:
            display_time = 2
        if window_name is None:
            window_name = "二维码显示"
    """
    使用OpenCV循环显示文件夹中的所有图片，适合7英寸屏幕显示
    
    参数:
        folder_path (str): 图片文件夹路径
        max_height (int): 图片最大高度，默认400（适合7英寸屏幕）
        display_time (int): 每张图片显示的时间（秒）
        window_name (str): 显示窗口的名称
    """
    # 支持的图片格式
    image_extensions = ['*.jpg', '*.jpeg', '*.png', '*.bmp', '*.tiff', '*.tif', '*.webp']
    
    # 获取所有图片文件
    image_files = []
    for extension in image_extensions:
        image_files.extend(glob.glob(os.path.join(folder_path, extension)))
    
    if not image_files:
        print(f"在文件夹 '{folder_path}' 中没有找到图片文件")
        return
    
    # 按文件名排序
    image_files.sort()
    
    print(f"找到 {len(image_files)} 张二维码图片")
    print("按 'q' 键退出，按 'p' 键暂停/继续，按 'n' 键下一张，按 'b' 键上一张")
    
    current_index = 0
    paused = False
    
    while True:
        if not paused:
            # 读取当前图片
            image_path = image_files[current_index]
            img = cv2.imread(image_path)
            
            if img is None:
                print(f"无法读取图片: {image_path}")
                current_index = (current_index + 1) % len(image_files)
                continue
            
            # 获取图片尺寸
            height, width = img.shape[:2]
            
            # 调整图片大小，使其适合7英寸屏幕
            # 计算缩放比例，保持纵横比
            scale_factor = max_height / height
            new_width = int(width * scale_factor)
            new_height = max_height
            img = cv2.resize(img, (new_width, new_height))
            
            # 在窗口标题中添加图片信息
            current_window_name = f"{window_name} - {os.path.basename(image_path)} ({current_index+1}/{len(image_files)})"
            
            # 显示图片，使用包含信息的窗口标题
            cv2.imshow(current_window_name, img)
            # 移动窗口到左上角，适合7英寸屏幕显示
            cv2.moveWindow(current_window_name, 0, 0)
            
            # 设置窗口属性，使其尽可能大但不超过屏幕
            cv2.setWindowProperty(current_window_name, cv2.WND_PROP_TOPMOST, 1)  # 窗口置顶
            
            # 显示当前图片信息
            print(f"显示: {os.path.basename(image_path)} ({current_index+1}/{len(image_files)})")
            
            # 移动到下一张图片
            current_index = (current_index + 1) % len(image_files)
        
        # 等待按键或超时
        key = cv2.waitKey(display_time * 1000) & 0xFF
        
        if key == ord('q'):  # 按 'q' 退出
            break
        elif key == ord('p'):  # 按 'p' 暂停/继续
            paused = not paused
            if paused:
                print("已暂停")
            else:
                print("继续播放")
        elif key == ord('n'):  # 按 'n' 下一张
            paused = False
        elif key == ord('b'):  # 按 'b' 上一张
            current_index = (current_index - 2) % len(image_files)
            paused = False
    
    # 关闭所有OpenCV窗口
    cv2.destroyAllWindows()
    print("幻灯片播放结束")

# 使用示例
if __name__ == "__main__":
    # 替换为你的图片文件夹路径
    # 可以从配置文件读取，但这里保持默认示例
    
    # 检查文件夹是否存在
    if not os.path.exists(folder_path):
        print(f"文件夹 '{folder_path}' 不存在")
    else:
        # 显示图片，每张显示2秒，调整为适合7英寸屏幕的高度
        display_images_with_opencv(folder_path, max_height=400, display_time=2)